package main;

import java.io.BufferedInputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import main.exceptions.ElementException;
import model.Element;


public class Alchemy {
	
	private Map<Integer, Element> elements;
	
	public Alchemy(Map<Integer, Element> elements) {
		this.elements = elements;
	}
	
	public void play() {
		GameLexer lexer;
		try{
			 lexer = new GameLexer(new BufferedInputStream(System.in));
			 while(lexer.next_token().sym != 0){}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void getTerminals(){
		TreeSet<Element> terminals = new TreeSet<Element>();
		for(Element e: elements.values()){
			if(e.isTerminal()){
				terminals.add(e);
			}
		}
		for(Element e: terminals){
			System.out.println(e);
		}
	}
	
	public void getOrigins(String element) throws ElementException{
		Element elem = null;
		elem = getElement(element);
		Set<Element> origins = elem.getOrigins();
		if(origins == null){
			System.out.println(elem + " is a basic element");
		} else{
			for(Element e: origins){
				System.out.println(e);
			}
		}
	}
	
	public void getAllCombinations(String element) throws ElementException{

		Element elem = getElement(element);
		Set<Element> comb = elem.getAllCombinations();
		if(comb.isEmpty()){
			System.out.println(elem + " is a terminal element");
		} else{
			for(Element e: comb){
				System.out.println(e);
			}
		}

	}
	
	private Element getElement(String name) throws ElementException{
		Element elem = null;
		for(Element e: elements.values()){
			if(e.getName().equals(name))
				elem = e;
		}
		if(elem == null){
			throw new ElementException(name + " is not an element");
		}
		return elem;
	}
	
	public void help(){
		System.out.println("Este juego consiste en combinar dos elementos para descubrir un nuevo elemento desconocido por el jugador. Existen cuatro elementos básicos, mediante los cuales se puede llegar a descubrir todos los demás. Estos son:");
		for(Element e: getBasicElements()){
			System.out.println("- " + e);
		}
		System.out.println("Pruebe ingresar \"water + air\", y de esta combinacion obtendrá rain (ejemplo válido dependiendo de la fuente de datos que use el programa). Siga probando combinar elementos básicos, o intente usando elementos recientemente descubiertos. \nEl objetivo principal es descubrir la mayor cantidad posible de elementos. \n ¡Mucha Suerte!");
	}
	
	private Set<Element> getBasicElements(){
		Set<Element> basics = new TreeSet<Element>();
		for(Element e: elements.values()){
			if(e.isBasic()){
				basics.add(e);
			}
		}
		return basics;
	}
	

	
}
